home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.asm.Label;
- import sun.tools.asm.SwitchData;
- import sun.tools.java.Environment;
- import sun.tools.java.Type;
-
- public class SwitchStatement extends Statement {
- Expression expr;
- Statement[] args;
-
- public SwitchStatement(int var1, Expression var2, Statement[] var3) {
- super(95, var1);
- this.expr = var2;
- this.args = var3;
- }
-
- long check(Environment var1, Context var2, long var3, Hashtable var5) {
- CheckContext var6 = new CheckContext(var2, this);
- var3 = this.expr.checkValue(var1, var6, ((Statement)this).reach(var1, var3), var5);
- Type var7 = this.expr.type;
- this.expr = ((Node)this).convert(var1, var6, Type.tInt, this.expr);
- Hashtable var8 = new Hashtable();
- boolean var9 = false;
- long var10 = var3;
-
- for(int var12 = 0; var12 < this.args.length; ++var12) {
- Statement var13 = this.args[var12];
- if (var13.op == 96) {
- var10 = var13.check(var1, var6, var3, var5);
- Expression var14 = ((CaseStatement)var13).expr;
- if (var14 != null) {
- if (var14 instanceof IntegerExpression) {
- Integer var15 = (Integer)((IntegerExpression)var14).getValue();
- int var16 = var15;
- if (var8.get(var14) != null) {
- var1.error(var13.where, "duplicate.label", var15);
- } else {
- var8.put(var14, var13);
- boolean var17;
- switch (var7.getTypeCode()) {
- case 1:
- var17 = var16 != (byte)var16;
- break;
- case 2:
- var17 = var16 != (char)var16;
- break;
- case 3:
- var17 = var16 != (short)var16;
- break;
- default:
- var17 = false;
- }
-
- if (var17) {
- var1.error(var13.where, "switch.overflow", var15, var7);
- }
- }
- } else {
- var1.error(var13.where, "const.expr.required");
- }
- } else {
- if (var9) {
- var1.error(var13.where, "duplicate.default");
- }
-
- var9 = true;
- }
- } else {
- var10 = var13.check(var1, var6, var10, var5);
- }
- }
-
- if ((var10 & Statement.DEAD_END) == 0L) {
- var6.vsBreak &= var10;
- }
-
- if (var9) {
- var3 = var6.vsBreak;
- }
-
- return var2.removeAdditionalVars(var3);
- }
-
- public Statement inline(Environment var1, Context var2) {
- var2 = new Context(var2, this);
- this.expr = this.expr.inlineValue(var1, var2);
-
- for(int var3 = 0; var3 < this.args.length; ++var3) {
- if (this.args[var3] != null) {
- this.args[var3] = this.args[var3].inline(var1, var2);
- }
- }
-
- return this;
- }
-
- public Statement copyInline(Context var1, boolean var2) {
- SwitchStatement var3 = (SwitchStatement)((Node)this).clone();
- this.expr = this.expr.copyInline(var1);
- var3.args = new Statement[this.args.length];
-
- for(int var4 = 0; var4 < this.args.length; ++var4) {
- if (this.args[var4] != null) {
- var3.args[var4] = this.args[var4].copyInline(var1, var2);
- }
- }
-
- return var3;
- }
-
- public int costInline(int var1) {
- int var2 = this.expr.costInline(var1);
-
- for(int var3 = 0; var3 < this.args.length && var2 < var1; ++var3) {
- if (this.args[var3] != null) {
- var2 += this.args[var3].costInline(var1);
- }
- }
-
- return var2;
- }
-
- public void code(Environment var1, Context var2, Assembler var3) {
- CodeContext var4 = new CodeContext(var2, this);
- this.expr.codeValue(var1, var4, var3);
- SwitchData var5 = new SwitchData();
- boolean var6 = false;
-
- for(int var7 = 0; var7 < this.args.length; ++var7) {
- Statement var8 = this.args[var7];
- if (var8 != null && var8.op == 96) {
- Expression var9 = ((CaseStatement)var8).expr;
- if (var9 != null) {
- var5.add(((IntegerExpression)var9).value, new Label());
- }
- }
- }
-
- var3.add(super.where, 170, var5);
-
- for(int var11 = 0; var11 < this.args.length; ++var11) {
- Statement var12 = this.args[var11];
- if (var12 != null) {
- if (var12.op == 96) {
- Expression var10 = ((CaseStatement)var12).expr;
- if (var10 != null) {
- var3.add(var5.get(((IntegerExpression)var10).value));
- } else {
- var3.add(var5.getDefaultLabel());
- var6 = true;
- }
- } else {
- var12.code(var1, var4, var3);
- }
- }
- }
-
- if (!var6) {
- var3.add(var5.getDefaultLabel());
- }
-
- var3.add(var4.breakLabel);
- }
-
- public void print(PrintStream var1, int var2) {
- super.print(var1, var2);
- var1.print("switch (");
- this.expr.print(var1);
- var1.print(") {\n");
-
- for(int var3 = 0; var3 < this.args.length; ++var3) {
- if (this.args[var3] != null) {
- ((Statement)this).printIndent(var1, var2 + 1);
- this.args[var3].print(var1, var2 + 1);
- var1.print("\n");
- }
- }
-
- ((Statement)this).printIndent(var1, var2);
- var1.print("}");
- }
- }
-